using namespace std;

#include <string>
#include "RegistroVariable.h"

RegistroVariable::RegistroVariable(){
	this->campoActual = 0;
}

void RegistroVariable::addCampo(void* valor, bool clave, string tipo, int cantidad){
	this->tipos.push_back(tipo);
	this->claves.push_back(clave);
	this->valores.push_back(valor);
	this->cantidad.push_back(cantidad);
}

void RegistroVariable::addCampo(string valor, bool clave){
	//se guarda como arreglo de char
	string tipo("char");
	int tamanio = valor.length();

	this->claves.push_back(clave);
	this->tipos.push_back(tipo);
	this->valores.push_back(&valor);
	this->cantidad.push_back(tamanio);
}

void RegistroVariable::addCampo(int* lista, int cantElementos){
	string tipo("int");
	this->claves.push_back(false);
	this->tipos.push_back(tipo);
	this->valores.push_back(&lista);
	this->cantidad.push_back(cantElementos);
}

void RegistroVariable::addCampo(char* lista, int cantElementos){
	string tipo("char");
	this->claves.push_back(false);
	this->tipos.push_back(tipo);
	this->valores.push_back(&lista);
	this->cantidad.push_back(cantElementos);
}

int RegistroVariable::getTamanio(){
	//Agregar tamaño de metadata
	int tamanio = 0;
	list<string>::iterator itTipos = this->tipos.begin();
	list<int>::iterator itCant = this->cantidad.begin();
	while(itTipos != this->tipos.end()){
		int cant = *itCant;
		if((*itTipos) == "int"){
			tamanio += sizeof(int)*cant;
		} else if((*itTipos) == "char"){
			tamanio += sizeof(char)*cant;
		} else if((*itTipos) == "double"){
			tamanio += sizeof(double)*cant;
		}

		tamanio += sizeof(int); //metadata de cantidad

		itTipos++;
		itCant++;
	}

	return tamanio;
}
